package utils

import (
	"github.com/gin-gonic/gin"
	"reflect"
	"time"
)

// 在utils/response.go文件中定义响应结构体和工具方法

// 定义标准响应结构体
type Response struct {
	Code      int         `json:"code"`           // 业务状态码
	Message   string      `json:"message"`        // 提示信息
	Timestamp int64       `json:"timestamp"`      // 时间戳
	Data      interface{} `json:"data,omitempty"` // 返回数据
}

// 定义常量状态码
var (
	SuccessCode      = 200 // 成功状态码
	ErrorCode        = 400 // 常规错误
	UnauthorizedCode = 401 // 未授权
	ForbiddenCode    = 403 // 禁止访问
	NotFoundCode     = 404 // 资源不存在
	ServerErrorCode  = 500 // 服务器错误
)

// 成功响应构建函数
func Success(c *gin.Context, message string, data interface{}) {
	msg := message
	if msg == "" {
		msg = "成功"
	}
	response := Response{
		Code:      SuccessCode,
		Message:   "success",
		Timestamp: time.Now().Unix(),
	}
	// 只有当data非空时赋值
	if !isNil(data) {
		response.Data = data
	}
	c.JSON(SuccessCode, response)
}

// 错误响应构建函数
func Error(c *gin.Context, code int, message string) {
	c.JSON(code, &Response{
		Code:      code,
		Message:   message,
		Timestamp: time.Now().Unix(),
	})
	c.Abort()
}

// 带数据的自定义错误响应
func ErrorWithData(c *gin.Context, code int, message string, data interface{}) {
	c.JSON(code, &Response{
		Code:      code,
		Message:   message,
		Timestamp: time.Now().Unix(),
		Data:      data,
	})
	c.Abort()
}

// 快速创建成功响应（带自定义消息）
func SuccessWithMessage(c *gin.Context, message string, data interface{}) {
	c.JSON(SuccessCode, &Response{
		Code:      SuccessCode,
		Message:   message,
		Timestamp: time.Now().Unix(),
		Data:      data,
	})
}

// 判断接口值是否为空
func isNil(i interface{}) bool {
	if i == nil {
		return true
	}
	// 处理指针类型的nil值
	val := reflect.ValueOf(i)
	return val.Kind() == reflect.Ptr && val.IsNil()
}
